package com.ajin.hot100;

import java.util.*;

public class Code2 {
    public static void main(String[] args) {
        String[] strs = new String[]{"eat", "tea", "tan", "ate", "nat", "bat"};
        List<List<String>> list = groupAnagrams2(strs);
        System.out.println(list.toString());
    }

    /**
     * 字母异位词分组
     * 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
     * 示例 1:
     * 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
     * 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
     * 解释：
     * 在 strs 中没有字符串可以通过重新排列来形成 "bat"。
     * 字符串 "nat" 和 "tan" 是字母异位词，因为它们可以重新排列以形成彼此。
     * 字符串 "ate" ，"eat" 和 "tea" 是字母异位词，因为它们可以重新排列以形成彼此。
     * 示例 2:
     * 输入: strs = [""]
     * 输出: [[""]]
     *
     * @param strs
     * @return
     */
    public static List<List<String>> groupAnagrams(String[] strs) {
        //定义一个map，key存储排序后的字符串（会唯一）,值为不同的循序的字符串
        HashMap<String, List<String>> hashMap = new HashMap<>();
        for (String s : strs) {
            //获取到字符串的每个字符，进行排序
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            String key = new String(chars);
            //如果不存在则创建默认值，存在则返回值，不需要手动判断
            hashMap.computeIfAbsent(key, k -> new ArrayList<>()).add(s);
            //然后遍历map得到的List放如到一个数组返回
        }
        return new ArrayList<>(hashMap.values());
    }
    public static List<List<String>> groupAnagrams2(String[] strs) {
        //定义一个map，key存储排序后的字符串（会唯一）,值为不同的循序的字符串
        HashMap<String, List<String>> hashMap = new HashMap<>();
        for (String s : strs) {
            //获取到字符串的每个字符，进行排序
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            String key = new String(chars);
            List<String> list = null;
            //如果存在key则新增list
            if (hashMap.containsKey(key)) {
                list = hashMap.get(key);
                list.add(s);
            } else {
                list = new ArrayList<>();
                list.add(s);
                hashMap.put(key, list);
            }
            //然后遍历map得到的List放如到一个数组返回
        }
        return new ArrayList<>(hashMap.values());
    }


}




